package serializer;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import model.ListWords;
import model.Word;

import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.output.*;


public class SerializerXml {
	
	private String file;

	public SerializerXml(String file) {
		this.file=file;
		try {
			createFile();
		} catch (IOException e) {
			throw new Error("Impossible de creer le fichier de base de donnée");
		}
	}

	
		/** Créer un nouveau fichier de données vierge à partir de son chemin
		 * 
		 * @return true si le fichier est créé, false sinon
		 * @throws IOException
		 * @throws NullPointerException
		 */
	public boolean createFile() throws IOException {
		// Obtenir une description du fichier a créer
		File f = new File(file);

		// Contrôler l'éventuelle existence du fichier
		if (!f.exists()) {
			// Créer le fichier
			try {
				// Mettre à jour le fichier xml
				Element racine = new Element("listwords");
				Document document = new Document(racine);

				Element transports = new Element("words");
				racine.addContent(transports);

				XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
				sortie.output(document, new FileOutputStream(file));
			} catch (Exception e) {
				return false;
			}
		}

		return true;
	}
	
	public boolean load(ListWords lw) {
		
		SAXBuilder sxb = new SAXBuilder();
		Document document;

		try {
			document = sxb.build(new File(file));
		} catch (Exception e) {
			System.out.println("Erreur lors de l'ouverture du fichier !");
			return false;
		}

		Element racine = document.getRootElement();

		Element theWords=racine.getChild("words");
		
		List<Element> wordList=theWords.getChildren("word");
		
		Iterator<Element> itWords = wordList.iterator();
		
		while(itWords.hasNext()) {
			
			// Traiter le mot courant
			Element currentWord = itWords.next();
			
			String name = currentWord.getChildText("name");
			
			String them = currentWord.getChildText("theme");
			
			Element racineSyllables=currentWord.getChild("syllables");
			
			List<Element> elemSyllables=racineSyllables.getChildren("syllable");			
			ArrayList<String> syllables=new ArrayList<String>();
			
			Iterator<Element> iterSyllabes=elemSyllables.iterator();
			
			while(iterSyllabes.hasNext()) {
				Element currentSyllable=iterSyllabes.next();
				
				syllables.add(currentSyllable.getChildText("syllable"));			
				
			}
			
			Word wo;		
			wo = new Word(name, them, syllables);
			lw.addWord(wo);
			
		}
		
		return true;
	}
	
	public boolean store(List<Word> words) {
		// On reinitialise le fichier
		try {
			File f = new File(file);
			f.delete();
			createFile();
		} catch (Exception e) {
			// TODO: handle exception
		}

		// Recupere le XML
		SAXBuilder sxb = new SAXBuilder();
		Document document;

		try {
			document = sxb.build(new File(file));
		} catch (Exception e) {
			System.out.println("Erreur lors de l'ouverture du fichier !");
			return false;
		}
		
		// Se placer à l'endroit de l'arborescence où l'on va mettre le nouveau
		// trajet
		Element racine = document.getRootElement();

		for (Word w: words) {
			Element word = w.parseXML();
			// Ajouter le nouveau trajet dans le fichier
			racine.addContent(word);
		}
		
		return true;
	}
	

	public static void main(String args[]) {
		//SerializerXml ser=new SerializerXml("vehicule.xml");
		//ListWords myListe=new ListWords("/home/hady/Bureau/Devint2012/src/model/vehicule.txt");
		//System.out.println(ser.store(myListe.getListWord()));
	}
}
